package com.aizuda.boot.modules.file.service;

import com.aizuda.boot.modules.file.domain.entity.FileConversionCache;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 文件转换缓存服务接口
 * 
 * @author yangshen
 * @date 2025-08-04
 */
public interface IFileConversionCacheService extends IService<FileConversionCache> {

    /**
     * 根据源文件ID和转换类型查找缓存记录
     * 
     * @param sourceFileId 源文件ID
     * @param conversionType 转换类型
     * @return 缓存记录，如果不存在返回null
     */
    FileConversionCache findBySourceFileIdAndType(String sourceFileId, String conversionType);

    /**
     * 根据源文件Key和转换类型查找缓存记录
     * 
     * @param sourceFileKey 源文件Key
     * @param conversionType 转换类型
     * @return 缓存记录，如果不存在返回null
     */
    FileConversionCache findBySourceFileKeyAndType(String sourceFileKey, String conversionType);

    /**
     * 保存转换缓存记录
     * 
     * @param sourceFileId 源文件ID
     * @param sourceFileKey 源文件Key
     * @param sourceFileMd5 源文件MD5
     * @param targetFileId 目标文件ID
     * @param targetFileKey 目标文件Key
     * @param conversionType 转换类型
     * @param fileSize 文件大小
     * @return 保存的缓存记录
     */
    FileConversionCache saveConversionCache(String sourceFileId, String sourceFileKey, String sourceFileMd5,
                                           String targetFileId, String targetFileKey, String conversionType, Long fileSize);

    /**
     * 检查缓存是否有效（检查源文件是否被修改）
     * 
     * @param cacheRecord 缓存记录
     * @param currentFileMd5 当前文件MD5
     * @return true-缓存有效，false-缓存无效
     */
    boolean isCacheValid(FileConversionCache cacheRecord, String currentFileMd5);

    /**
     * 删除指定源文件的所有转换缓存
     * 
     * @param sourceFileId 源文件ID
     * @return 删除的记录数
     */
    int deleteBySourceFileId(String sourceFileId);

    /**
     * 获取或创建Word转PDF缓存
     * 会先检查缓存是否存在且有效，如果不存在则执行转换并保存缓存
     * 
     * @param sourceFileId 源文件ID
     * @param sourceFileKey 源文件Key
     * @param sourceFileMd5 源文件MD5
     * @param converterFunction 转换函数，参数为源文件信息，返回转换后的文件数据
     * @return 转换后的文件Key
     */
    String getOrCreateWordToPdfCache(String sourceFileId, String sourceFileKey, String sourceFileMd5,
                                    java.util.function.Function<String, ConversionResult> converterFunction);

    /**
     * 转换结果封装类
     */
    class ConversionResult {
        private String targetFileKey;
        private String targetFileId;
        private Long fileSize;
        private byte[] fileData;
        private String fileName;

        public ConversionResult(String targetFileKey, String targetFileId, Long fileSize) {
            this.targetFileKey = targetFileKey;
            this.targetFileId = targetFileId;
            this.fileSize = fileSize;
        }

        public ConversionResult(String targetFileKey, byte[] fileData, String fileName) {
            this.targetFileKey = targetFileKey;
            this.fileData = fileData;
            this.fileName = fileName;
        }

        public String getTargetFileKey() {
            return targetFileKey;
        }

        public String getTargetFileId() {
            return targetFileId;
        }

        public Long getFileSize() {
            return fileSize;
        }

        public byte[] getFileData() {
            return fileData;
        }

        public String getFileName() {
            return fileName;
        }
    }
}